home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / hplip / setup.py < prev    next >
Text File  |  2008-10-13  |  48KB  |  1,144 lines

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. #
  4. # (c) Copyright 2003-2008 Hewlett-Packard Development Company, L.P.
  5. #
  6. # This program is free software; you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation; either version 2 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with this program; if not, write to the Free Software
  18. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  19. #
  20. # Author: Don Welch
  21. #
  22.  
  23.  
  24. __version__ = '7.2'
  25. __title__ = 'Printer/Fax Setup Utility'
  26. __doc__ = "Installs HPLIP printers and faxes in the CUPS spooler. Tries to automatically determine the correct PPD file to use. Allows the printing of a testpage. Performs basic fax parameter setup."
  27.  
  28. # Std Lib
  29. import sys
  30. import getopt
  31. import time
  32. import os.path
  33. import re
  34. import os
  35. import gzip
  36.  
  37. try:
  38.     import readline
  39. except ImportError:
  40.     pass
  41.  
  42. # Local
  43. from base.g import *
  44. from base import device, utils, tui, models
  45. from prnt import cups
  46.  
  47. pm = None
  48.  
  49. def plugin_download_callback(c, s, t):
  50.     pm.update(int(100*c*s/t), 
  51.              utils.format_bytes(c*s))
  52.  
  53.  
  54. nickname_pat = re.compile(r'''\*NickName:\s*\"(.*)"''', re.MULTILINE)
  55.  
  56. USAGE = [ (__doc__, "", "name", True),
  57.           ("Usage: hp-setup [MODE] [OPTIONS] [SERIAL NO.|USB bus:device|IP|DEVNODE]", "", "summary", True),
  58.           ("[MODE]", "", "header", False),
  59.           ("Enter graphical UI mode:", "-u or --gui (Default)", "option", False),
  60.           ("Run in interactive mode:", "-i or --interactive", "option", False),
  61.           utils.USAGE_SPACE,
  62.           utils.USAGE_OPTIONS,
  63.           ("Automatic mode:", "-a or --auto (-i mode only)", "option", False),
  64.           ("To specify the port on a multi-port JetDirect:", "-p<port> or --port=<port> (Valid values are 1\*, 2, and 3. \*default)", "option", False),
  65.           ("No testpage in automatic mode:", "-x (-i mode only)", "option", False),
  66.           ("To specify a CUPS printer queue name:", "-n<printer> or --printer=<printer> (-i mode only)", "option", False),
  67.           ("To specify a CUPS fax queue name:", "-f<fax> or --fax=<fax> (-i mode only)", "option", False),
  68.           ("Type of queue(s) to install:", "-t<typelist> or --type=<typelist>. <typelist>: print*, fax\* (\*default) (-i mode only)", "option", False),
  69.           ("Bus to probe (if device not specified):", "-b<bus> or --bus=<bus>", "option", False),
  70.           #utils.USAGE_BUS2,
  71.           ("", "<bus>: usb\*, net, par (\*default)", 'option', False),
  72.           utils.USAGE_LANGUAGE,
  73.           utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
  74.           utils.USAGE_HELP,
  75.           ("[SERIAL NO.|USB ID|IP|DEVNODE]", "", "heading", False),
  76.           ("USB bus:device (usb only):", """"xxx:yyy" where 'xxx' is the USB bus and 'yyy' is the USB device. (Note: The ':' and all leading zeros must be present.)""", 'option', False),
  77.           ("", "Use the 'lsusb' command to obtain this information.", "option", False),
  78.           ("IPs (network only):", 'IPv4 address "a.b.c.d" or "hostname"', "option", False),
  79.           ("DEVNODE (parallel only):", '"/dev/parportX", X=0,1,2,...', "option", False),
  80.           ("SERIAL NO. (usb and parallel only):", '"serial no."', "option", True),
  81.           utils.USAGE_EXAMPLES,
  82.           ("Setup using GUI mode:", "$ hp-setup", "example", False),
  83.           ("Setup using GUI mode, specifying usb:", "$ hp-setup -b usb", "example", False),
  84.           ("Setup using GUI mode, specifying an IP:", "$ hp-setup 192.168.0.101", "example", False),          
  85.           ("One USB printer attached, automatic:", "$ hp-setup -i -a", "example", False),
  86.           ("USB, IDs specified:", "$ hp-setup -i 001:002", "example", False),
  87.           ("Network:", "$ hp-setup -i 66.35.250.209", "example", False),
  88.           ("Network, Jetdirect port 2:", "$ hp-setup -i --port=2 66.35.250.209", "example", False),
  89.           ("Parallel:", "$ hp-setup -i /dev/parport0", "example", False),
  90.           ("USB or parallel, using serial number:", "$ hp-setup -i US12345678A", "example", False),
  91.           ("USB, automatic:", "$ hp-setup -i --auto 001:002", "example", False),
  92.           ("Parallel, automatic, no testpage:", "$ hp-setup -i -a -x /dev/parport0", "example", False),
  93.           ("Parallel, choose device:", "$ hp-setup -i -b par", "example", False),
  94.           utils.USAGE_SPACE,
  95.           utils.USAGE_NOTES,
  96.           ("1. If no serial number, USB ID, IP, or device node is specified, the USB and parallel busses will be probed for devices.", "", 'note', False),
  97.           ("2. Using 'lsusb' to obtain USB IDs: (example)", "", 'note', False),
  98.           ("   $ lsusb", "", 'note', False),
  99.           ("         Bus 003 Device 011: ID 03f0:c202 Hewlett-Packard", "", 'note', False),
  100.           ("   $ hp-setup --auto 003:011", "", 'note', False),
  101.           ("   (Note: You may have to run 'lsusb' from /sbin or another location. Use '$ locate lsusb' to determine this.)", "", 'note', True),
  102.           ("3. Parameters -a, -n, -f, or -t are not valid in GUI (-u) mode.", "", 'note', True),
  103.           utils.USAGE_SPACE,
  104.           utils.USAGE_SEEALSO,
  105.           ("hp-makeuri", "", "seealso", False),
  106.           ("hp-probe", "", "seealso", False),
  107.         ]
  108.  
  109.  
  110. ##plugin_eula = """LICENSE TERMS FOR HP Linux Imaging and Printing (HPLIP) Driver Plug-in
  111. ##
  112. ##These License Terms govern your Use of the HPLIP Driver Plug-in Software (the "Software"). USE OF THE SOFTWARE INCLUDING, WITHOUT LIMITATION, ANY DOCUMENTATION, IS SUBJECT TO THESE LICENSE TERMS AND THE APPLICABLE AS-IS WARRANTY STATEMENT.  BY DOWNLOADING AND INSTALLING THE SOFTWARE, YOU ARE AGREEING TO BE BOUND BY THESE TERMS. IF YOU DO NOT AGREE TO ALL OF THESE TERMS, DO NOT DOWNLOAD AND INSTALL THE SOFTWARE ON YOUR SYSTEM.
  113. ##
  114. ##1. License Grant.    HP grants you a license to Use one copy of the Software with HP printing products only.  "Use" includes using, storing, loading, installing, executing, and displaying the Software.  You may not modify the Software or disable any licensing or control features of the Software.
  115. ##
  116. ##2. Ownership.   The Software is owned and copyrighted by HP or its third party suppliers.  Your license confers no title to, or ownership in, the Software and is not a sale of any rights in the Software.  HP's third party suppliers may protect their rights in the Software in the event of any violation of these license terms.
  117. ##
  118. ##3. Copies and Adaptations.   You may only make copies or adaptations of the Software for archival purposes or when copying or adaptation is an essential step in the authorized Use of the Software. You must reproduce all copyright notices in the original Software on all copies or adaptations.  You may not copy the Software onto any public network.
  119. ##
  120. ##4. No Disassembly.   You may not Disassemble the Software unless HP's prior written consent is obtained.  "Disassemble" includes disassembling, decompiling, decrypting, and reverse engineering.   In some jurisdictions, HP's consent may not be required for limited Disassembly.  Upon request, you will provide HP with reasonably detailed information regarding any Disassembly.
  121. ##
  122. ##5. No Transfer.   You may not assign, sublicense or otherwise transfer all or any part of these License Terms or the Software.
  123. ##
  124. ##6. Termination.   HP may terminate your license, upon notice, for failure to comply with any of these License Terms.  Upon termination, you must immediately destroy the Software, together with all copies, adaptations and merged portions in any form.
  125. ##
  126. ##7. Export Requirements.   You may not export or re-export the Software or any copy or adaptation in violation of any applicable laws or regulations.
  127. ##
  128. ##8. U.S. Government Restricted Rights.   The Software has been developed entirely at private expense.  It is delivered and licensed, as defined in any applicable DFARS, FARS, or other equivalent federal agency regulation or contract clause, as either "commercial computer software" or "restricted computer software", whichever is applicable.  You have only those rights provided for such Software by the applicable clause or regulation or by these License Terms.
  129. ##
  130. ##9. DISCLAIMER OF WARRANTIES.   TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, HP AND ITS SUPPLIERS PROVIDE THE SOFTWARE "AS IS" AND WITH ALL FAULTS, AND HEREBY DISCLAIM ALL OTHER WARRANTIES AND CONDITIONS, EITHER EXPRESS, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF TITLE AND NON-INFRINGEMENT, ANY IMPLIED WARRANTIES, DUTIES OR CONDITIONS OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE, AND OF LACK OF VIRUSES ALL WITH REGARD TO THE SOFTWARE.  Some states/jurisdictions do not allow exclusion of implied warranties or limitations on the duration of implied warranties, so the above disclaimer may not apply to you in its entirety.
  131. ##
  132. ##10. LIMITATION OF LIABILITY.  Notwithstanding any damages that you might incur, the entire liability of HP and any of its suppliers under any provision of this agreement and your exclusive remedy for all of the foregoing shall be limited to the greater of the amount actually paid by you separately for the Software or U.S. $5.00.  TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL HP OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, BUT NOT LIMITED TO, DAMAGES FOR LOSS OF PROFITS OR CONFIDENTIAL OR OTHER INFORMATION, FOR BUSINESS INTERRUPTION, FOR PERSONAL INJURY, FOR LOSS OF PRIVACY ARISING OUT OF OR IN ANY WAY RELATED TO THE USE OF OR INABILITY TO USE THE SOFTWARE, OR OTHERWISE IN CONNECTION WITH ANY PROVISION OF THIS AGREEMENT, EVEN IF HP OR ANY SUPPLIER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND EVEN IF THE REMEDY FAILS OF ITS ESSENTIAL PURPOSE.  Some states/jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so the above limitation or exclusion may not apply to you."""
  133.  
  134. def usage(typ='text'):
  135.     if typ == 'text':
  136.         utils.log_title(__title__, __version__)
  137.  
  138.     utils.format_text(USAGE, typ, __title__, 'hp-setup', __version__)
  139.     sys.exit(0)
  140.  
  141.  
  142. def restart_cups():
  143.     if os.path.exists('/etc/init.d/cups'):
  144.         return '/etc/init.d/cups restart'
  145.  
  146.     elif os.path.exists('/etc/init.d/cupsys'):
  147.         return '/etc/init.d/cupsys restart'
  148.  
  149.     else:
  150.         return 'killall -HUP cupsd'
  151.  
  152.  
  153. log.set_module('hp-setup')
  154.  
  155. try:
  156.     opts, args = getopt.getopt(sys.argv[1:], 'p:n:d:hl:b:t:f:axguiq:',
  157.         ['printer=', 'fax=', 'device=', 'help', 'help-rest', 'help-man',
  158.          'logging=', 'bus=', 'type=', 'auto', 'port=', 'gui', 'interactive',
  159.          'help-desc', 'username=', 'lang='])
  160. except getopt.GetoptError, e:
  161.     log.error(e.msg)
  162.     usage()
  163.  
  164. printer_name = None
  165. fax_name = None
  166. device_uri = None
  167. log_level = logger.DEFAULT_LOG_LEVEL
  168. bus = None
  169. setup_print = True
  170. setup_fax = True
  171. makeuri = None
  172. auto = False
  173. testpage_in_auto_mode = True
  174. jd_port = 1
  175. mode = GUI_MODE
  176. mode_specified = False
  177. username = ''
  178. loc = None
  179.  
  180. if os.getenv("HPLIP_DEBUG"):
  181.     log.set_level('debug')
  182.  
  183. for o, a in opts:
  184.     if o in ('-h', '--help'):
  185.         usage('text')
  186.  
  187.     elif o == '--help-rest':
  188.         usage('rest')
  189.  
  190.     elif o == '--help-man':
  191.         usage('man')
  192.  
  193.     elif o == '--help-desc':
  194.         print __doc__,
  195.         sys.exit(0)
  196.  
  197.     elif o == '-x':
  198.         testpage_in_auto_mode = False
  199.  
  200.     elif o in ('-n', '--printer'):
  201.         printer_name = a
  202.  
  203.     elif o in ('-f', '--fax'):
  204.         fax_name = a
  205.  
  206.     elif o in ('-d', '--device'):
  207.         device_uri = a
  208.  
  209.     elif o in ('-b', '--bus'):
  210.         bus = [x.lower().strip() for x in a.split(',')]
  211.         if not device.validateBusList(bus, False):
  212.             usage()
  213.  
  214.     elif o in ('-l', '--logging'):
  215.         log_level = a.lower().strip()
  216.         if not log.set_level(log_level):
  217.             usage()
  218.  
  219.     elif o == '-g':
  220.         log.set_level('debug')
  221.  
  222.     elif o in ('-t', '--type'):
  223.         setup_fax, setup_print = False, False
  224.         a = a.strip().lower()
  225.         for aa in a.split(','):
  226.             if aa.strip() not in ('print', 'fax'):
  227.                 usage()
  228.             
  229.             if aa.strip() == 'print':
  230.                 setup_print = True
  231.             
  232.             elif aa.strip() == 'fax':
  233.                 if not prop.fax_build:
  234.                     log.error("Cannot enable fax setup - HPLIP not built with fax enabled.")
  235.                 else:
  236.                     setup_fax = True
  237.  
  238.     elif o in ('-p', '--port'):
  239.         try:
  240.             jd_port = int(a)
  241.         except ValueError:
  242.             log.error("Invalid port number. Must be between 1 and 3 inclusive.")
  243.             usage()
  244.  
  245.     elif o in ('-a', '--auto'):
  246.         auto = True
  247.  
  248.     elif o in ('-u', '--gui'):
  249.         if mode_specified:
  250.             log.error("You may only specify a single mode as a parameter (-i or -u).")
  251.             sys.exit(1)
  252.  
  253.         mode = GUI_MODE
  254.         mode_specified = True
  255.  
  256.     elif o in ('-i', '--interactive'):
  257.         if mode_specified:
  258.             log.error("You may only specify a single mode as a parameter (-i or -u).")
  259.             sys.exit(1)
  260.  
  261.         mode = INTERACTIVE_MODE
  262.         mode_specified = True
  263.  
  264.     elif o == '--username':
  265.         username = a
  266.  
  267.     elif o in ('-q', '--lang'):
  268.         if a.strip() == '?':
  269.             tui.show_languages()
  270.             sys.exit(0)
  271.  
  272.         loc = utils.validate_language(a.lower())
  273.  
  274. try:
  275.     param = args[0]
  276. except IndexError:
  277.     param = ''
  278.  
  279. log.debug("param=%s" % param)
  280.  
  281. utils.log_title(__title__, __version__)
  282.  
  283. if mode == GUI_MODE:
  284.     if not prop.gui_build:
  285.         log.warn("GUI mode disabled in build. Reverting to interactive mode.")
  286.         mode = INTERACTIVE_MODE
  287.  
  288.     elif not os.getenv('DISPLAY'):
  289.         log.warn("No display found. Reverting to interactive mode.")
  290.         mode = INTERACTIVE_MODE
  291.  
  292.     elif not utils.checkPyQtImport():
  293.         log.warn("PyQt init failed. Reverting to interactive mode.")
  294.         mode = INTERACTIVE_MODE
  295.  
  296.         
  297. if mode == GUI_MODE:
  298.     from qt import *
  299.     from ui import setupform
  300.  
  301.     app = QApplication(sys.argv)
  302.     QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
  303.  
  304.     if loc is None:
  305.         loc = user_cfg.ui.get("loc", "system")
  306.         if loc.lower() == 'system':
  307.             loc = str(QTextCodec.locale())
  308.             log.debug("Using system locale: %s" % loc)
  309.  
  310.     if loc.lower() != 'c':
  311.         e = 'utf8'
  312.         try:
  313.             l, x = loc.split('.')
  314.             loc = '.'.join([l, e])
  315.         except ValueError:
  316.             l = loc
  317.             loc = '.'.join([loc, e])
  318.  
  319.         log.debug("Trying to load .qm file for %s locale." % loc)
  320.         trans = QTranslator(None)
  321.  
  322.         qm_file = 'hplip_%s.qm' % l
  323.         log.debug("Name of .qm file: %s" % qm_file)
  324.         loaded = trans.load(qm_file, prop.localization_dir)
  325.  
  326.         if loaded:
  327.             app.installTranslator(trans)
  328.         else:
  329.             loc = 'c'
  330.  
  331.     if loc == 'c':
  332.         log.debug("Using default 'C' locale")
  333.     else:
  334.         log.debug("Using locale: %s" % loc)
  335.         QLocale.setDefault(QLocale(loc))
  336.         prop.locale = loc
  337.         try:
  338.             locale.setlocale(locale.LC_ALL, locale.normalize(loc))
  339.         except locale.Error:
  340.             pass
  341.  
  342.     if not os.geteuid() == 0:
  343.         log.error("You must be root to run this utility.")
  344.  
  345.         QMessageBox.critical(None, 
  346.                              "HP Device Manager - Printer Setup Wizard",
  347.                              "You must be root to run hp-setup.",
  348.                               QMessageBox.Ok,
  349.                               QMessageBox.NoButton,
  350.                               QMessageBox.NoButton)
  351.  
  352.         sys.exit(1)
  353.  
  354.     try:
  355.         w = setupform.SetupForm(bus, param, jd_port, username)
  356.     except Error:
  357.         log.error("Unable to connect to HPLIP I/O. Please (re)start HPLIP and try again.")
  358.         sys.exit(1)
  359.  
  360.     app.setMainWidget(w)
  361.     w.show()
  362.  
  363.     app.exec_loop()
  364.  
  365.     
  366.     
  367. else: # INTERACTIVE_MODE
  368.     try:
  369.         if not os.geteuid() == 0:
  370.             log.error("You must be root to run this utility.")
  371.             sys.exit(1)
  372.  
  373.         if not auto:
  374.             log.info("(Note: Defaults for each question are maked with a '*'. Press <enter> to accept the default.)")
  375.             log.info("")
  376.  
  377.         # ******************************* MAKEURI
  378.         if param:
  379.             device_uri, sane_uri, fax_uri = device.makeURI(param, jd_port)
  380.  
  381.         # ******************************* CONNECTION TYPE CHOOSER
  382.         if not device_uri and bus is None:
  383.             x = 1
  384.             ios = {0: ('usb', "Universal Serial Bus (USB)") }
  385.             if prop.net_build: 
  386.                 ios[x] = ('net', "Network/Ethernet/Wireless (direct connection or JetDirect)")
  387.                 x += 1
  388.             if prop.par_build: 
  389.                 ios[x] = ('par', "Parallel Port (LPT:)")
  390.                 x += 1
  391.  
  392.             if len(ios) > 1:
  393.                 tui.header("CHOOSE CONNECTION TYPE")
  394.                 f = tui.Formatter()
  395.                 f.max_widths = (10, 10, 40)
  396.                 f.header = ("Num.", "Connection Type", "Connection Type Description")
  397.  
  398.                 for x, data in ios.items():
  399.                     if not x:
  400.                         f.add((str(x) + "*", data[0], data[1]))
  401.                     else:
  402.                         f.add((str(x), data[0], data[1]))
  403.  
  404.                 f.output()
  405.  
  406.                 ok, val = tui.enter_range("\nEnter number 0...%d for connection type (q=quit, enter=usb*) ? " % x, 
  407.                     0, x, 0)
  408.  
  409.                 if not ok: sys.exit(0)
  410.  
  411.                 bus = [ios[val][0]]
  412.             else:
  413.                 bus = [ios[0][0]]
  414.  
  415.             log.info("\nUsing connection type: %s" % bus[0])
  416.  
  417.         # ******************************* DEVICE CHOOSER
  418.  
  419.         if not device_uri: 
  420.             tui.header("DEVICE DISCOVERY")
  421.             try:
  422.                 device_uri = device.getInteractiveDeviceURI(bus)
  423.                 if device_uri is None:
  424.                     sys.exit(1)
  425.  
  426.             except Error:
  427.                 log.error("Error occured during interactive mode. Exiting.")
  428.                 sys.exit(1)
  429.  
  430.         # ******************************* QUERY MODEL AND COLLECT PPDS
  431.         log.info(log.bold("\nSetting up device: %s\n" % device_uri))
  432.  
  433.  
  434.         log.info("")
  435.         print_uri = device_uri.replace("hpfax:", "hp:")
  436.         fax_uri = device_uri.replace("hp:", "hpfax:")
  437.  
  438.         back_end, is_hp, bus, model, \
  439.             serial, dev_file, host, port = \
  440.             device.parseDeviceURI(device_uri)
  441.  
  442.         log.debug("Model=%s" % model)
  443.         mq = device.queryModelByURI(device_uri)
  444.  
  445.         if not mq or mq.get('support-type', SUPPORT_TYPE_NONE) == SUPPORT_TYPE_NONE:
  446.             log.error("Unsupported printer model.")
  447.             sys.exit(1)
  448.  
  449.         if not mq.get('fax-type', FAX_TYPE_NONE) and setup_fax:
  450.             #log.warning("Cannot setup fax - device does not have fax feature.")
  451.             setup_fax = False
  452.  
  453.         # ******************************* PLUGIN
  454.  
  455. ##        from installer import core_install
  456. ##        core = core_install.CoreInstall()
  457.         norm_model = models.normalizeModelName(model).lower()
  458. ##
  459.         plugin = mq.get('plugin', PLUGIN_NONE)
  460.         #skip = False
  461.  
  462.         plugin_installed = utils.to_bool(sys_cfg.hplip.plugin)
  463.         if plugin > PLUGIN_NONE and not plugin_installed: 
  464.             tui.header("PLUG-IN INSTALLATION")
  465.             
  466.             hp_plugin = utils.which('hp-plugin')
  467.             
  468.             if hp_plugin:
  469.                 os.system("hp_plugin -i")
  470.                 
  471. ##
  472. ##
  473. ####            #plugin_lib = mq.get("plugin-library")
  474. ##            fw_download = mq.get("fw-download")
  475. ####
  476. ####            #log.debug("Plug-in library=%s" % plugin_lib)
  477. ####            log.debug("FW download=%s" % fw_download)
  478. ####
  479. ##            if plugin == PLUGIN_REQUIRED:
  480. ##                log.debug("Plug-in required and not installed for model %s" % norm_model)
  481. ##                log.info(log.bold("A plug-in is required for this printer."))
  482. ##                for line in tui.format_paragraph("""An additional software plug-in is required to operate this printer. You may download the plug-in directly from HP, or, if you already have a copy, you can specify a path to the file."""):
  483. ##                    log.info(line)
  484. ##
  485. ##                ok, ans = tui.enter_choice("\nDownload plug-in from HP (recomended) or specify a path to the plug-in (d=download*, p=specify path, q=quit) ? ", ['d', 'p'], 'd')
  486. ##
  487. ##                if not ok:
  488. ##                    sys.exit(0)
  489. ##
  490. ##            else:
  491. ##                log.debug("Plug-in optional and not installed for model %s" % norm_model)
  492. ##                log.info(log.bold("A plug-in is optional for this printer."))
  493. ##                for line in tui.format_paragraph("""An optional driver plug-in is available to enhance the operation of this printer. You may skip this installation, download the plug-in directly from an HP authorized server, or, if you already have a copy of the file, you can specify a path to the file."""):
  494. ##                    log.info(line)            
  495. ##
  496. ##                ok, ans = tui.enter_choice("\nDownload plug-in from HP (recomended), specify a path to the plug-in, or skip installation (d=download*, p=specify path, s=skip, q=quit) ? ", ['d', 'p', 's'], 'd')
  497. ##
  498. ##                if not ok:
  499. ##                    sys.exit(0)
  500. ##
  501. ##                if ans == 's':
  502. ##                    skip = True
  503. ##
  504. ##
  505. ##            if not skip:
  506. ##
  507. ##                from installer import core_install
  508. ##                core = core_install.CoreInstall()
  509. ##                core.set_plugin_version(sys_cfg.hplip.version)
  510. ##
  511. ##                if ans == 'd':
  512. ##                    plugin_conf_url = core.get_plugin_conf_url(version)
  513. ##                    
  514. ##                    ok = True
  515. ##                    if plugin_conf_url.startswith('http'):    
  516. ##                        log.info("\nChecking for network connection...")
  517. ##                    
  518. ##                        ok = core.check_network_connection()
  519. ##                        
  520. ##                    if ok:
  521. ##                            #def get_plugin_info(self, version, url, local_conf, callback):
  522. ####
  523. ##                        log.info("Downloading configuration...")
  524. ##                        pm = tui.ProgressMeter("Downloading configuration:")
  525. ##                        
  526. ##                        url, size, checksum, timestamp, ok = core.get_plugin_info(version,
  527. ##                            plugin_conf_url, plugin_download_callback)
  528. ##                        
  529. ##                        log.info("")
  530. ##
  531. ##                        log.debug("url= %s" % url)
  532. ##                        log.debug("size=%d" % size)
  533. ##                        log.debug("checksum=%s" % checksum)
  534. ##                        log.debug("timestamp=%f" % timestamp)
  535. ##
  536. ##                        if url and size and checksum and timestamp and ok:
  537. ##                            log.info("Downloading plug-in...")
  538. ##
  539. ##                            pm = tui.ProgressMeter("Downloading plugin:")
  540. ##                            ok, plugin_file = core.download_plugin(norm_model, url, size, 
  541. ##                                checksum, timestamp, plugin_download_callback)
  542. ##
  543. ##                            log.info("")
  544. ##
  545. ##                            if not ok:
  546. ##                                log.error("Plugin download failed.")
  547. ##                                sys.exit(1)
  548. ##
  549. ##                    else:
  550. ##                        log.error("Network connection not found.")
  551. ##                        sys.exit(1)
  552. ##
  553. ##
  554. ##                else: # "p": path
  555. ##                    while True:
  556. ##                        user_input = raw_input(log.bold("Enter the path to the %s.plugin file (q=quit) : " % norm_model)).strip()
  557. ##                        if user_input.strip().lower() == 'q':
  558. ##                            sys.exit(1)
  559. ##
  560. ##                        if not user_input.endswith('.plugin'):
  561. ##                            log.error("Plug-in filename must end with '.plugin' extension.")
  562. ##                            continue
  563. ##
  564. ##                        if os.path.exists(user_input):
  565. ##                            ok = core.copy_plugin(norm_model, user_input)
  566. ##
  567. ##                            if not ok:
  568. ##                                log.error("File copy failed.")
  569. ##
  570. ##                            else:
  571. ##                                break
  572. ##                        else:
  573. ##                            log.error("File not found.")
  574. ##
  575. ##                if ok:
  576. ##                    core.run_plugin()
  577. ##                    #pass
  578. ####                    log.info("Installing plug-in...")
  579. ####                    # TODO:
  580. ####                    #ok = core.install_plugin(norm_model, plugin_lib)
  581. ####                    ok = True
  582. ####                    if not ok:
  583. ####                        log.error("Plug-in install failed.")
  584. ####                        sys.exit(1)
  585. ####
  586. ####                    else:
  587. ####                        log.info("\nPlug-in installation complete.\n")
  588. ####
  589. ##                    # Download firmware if needed
  590. ##                    #if mq.get('fw-download', 0):
  591. ##                    if fw_download:
  592. ##                        log.info(log.bold("\nDownloading firmware..."))
  593. ##                        try:
  594. ##                            d = device.Device(print_uri)
  595. ##                        except Error:
  596. ##                            log.error("Error opening device. Exiting.")
  597. ##                            sys.exit(1)
  598. ##
  599. ##                        if d.downloadFirmware():
  600. ##                            log.info("Done.\n")
  601. ##
  602. ##                        d.close()
  603.  
  604.  
  605.         ppds = cups.getSystemPPDs()
  606.  
  607.         default_model = utils.xstrip(model.replace('series', '').replace('Series', ''), '_')
  608.         stripped_model = cups.stripModel(default_model)
  609.  
  610.         # ******************************* PRINT QUEUE SETUP
  611.         if setup_print:
  612.             tui.header("PRINT QUEUE SETUP")
  613.  
  614.             installed_print_devices = device.getSupportedCUPSDevices(['hp'])  
  615.             log.debug(installed_print_devices)
  616.  
  617.             if not auto and print_uri in installed_print_devices:
  618.                 log.warning("One or more print queues already exist for this device: %s." % 
  619.                     ', '.join(installed_print_devices[print_uri]))
  620.  
  621.                 ok, setup_print = tui.enter_yes_no("\nWould you like to install another print queue for this device", 'n')
  622.                 if not ok: sys.exit(0)
  623.  
  624.         if setup_print:
  625.             if auto:
  626.                 printer_name = default_model
  627.  
  628.             printer_default_model = default_model
  629.  
  630.             # Check for duplicate names
  631.             if device_uri in installed_print_devices and \
  632.                 printer_default_model in installed_print_devices[device_uri]:
  633.                     i = 2
  634.                     while True:
  635.                         t = printer_default_model + "_%d" % i
  636.                         if t not in installed_print_devices[device_uri]:
  637.                             printer_default_model += "_%d" % i
  638.                             break
  639.                         i += 1
  640.  
  641.             if not auto:
  642.                 if printer_name is None:
  643.                     while True:
  644.                         printer_name = raw_input(log.bold("\nPlease enter a name for this print queue (m=use model name:'%s'*, q=quit) ?" % printer_default_model))
  645.  
  646.                         if printer_name.lower().strip() == 'q':
  647.                             log.info("OK, done.")
  648.                             sys.exit(0)
  649.  
  650.                         if not printer_name or printer_name.lower().strip() == 'm':
  651.                             printer_name = printer_default_model
  652.  
  653.                         name_ok = True
  654.  
  655.                         if print_uri in installed_print_devices:
  656.                             for d in installed_print_devices[print_uri]:
  657.                                 if printer_name in d:
  658.                                     log.error("A print queue with that name already exists. Please enter a different name.")
  659.                                     name_ok = False
  660.                                     break
  661.  
  662.                         for c in printer_name:
  663.                             if c in (' ', '#', '/', '%'):
  664.                                 log.error("Invalid character '%s' in printer name. Please enter a name that does not contain this character." % c)
  665.                                 name_ok = False
  666.  
  667.                         if name_ok:
  668.                             break
  669.             else:
  670.                 printer_name = printer_default_model
  671.  
  672.             log.info("Using queue name: %s" % printer_name)
  673.  
  674.             default_model = utils.xstrip(model.replace('series', '').replace('Series', ''), '_')
  675.             stripped_model = default_model.lower().replace('hp-', '').replace('hp_', '')
  676.  
  677.             mins = cups.getPPDFile(stripped_model, ppds)
  678.             x = len(mins)
  679.  
  680.             enter_ppd = False
  681.  
  682.             if x == 0:
  683.                 enter_ppd = True
  684.  
  685.             elif x == 1:
  686.                 print_ppd = mins.keys()[0]
  687.                 log.info("\nFound a possible PPD file: %s" % print_ppd)
  688.                 log.info("Desc: %s" % mins[print_ppd])
  689.  
  690.                 if not auto:
  691.                     log.info("\nNote: The model number may vary slightly from the actual model number on the device.")
  692.                     ok, ans = tui.enter_yes_no("\nDoes this PPD file appear to be the correct one")
  693.                     if not ok: sys.exit(0)
  694.                     if not ans: enter_ppd = True
  695.  
  696.             else:
  697.                 log.info("")
  698.                 log.warn("Found multiple possible PPD files")
  699.  
  700.                 max_ppd_filename_size = 0
  701.                 for p in mins:
  702.                     max_ppd_filename_size = max(len(p), max_ppd_filename_size)
  703.  
  704.                 log.info(log.bold("\nChoose a PPD file that most closely matches your device:"))
  705.                 log.info("(Note: The model number may vary slightly from the actual model number on the device.)\n")
  706.  
  707.                 formatter = utils.TextFormatter(
  708.                         (
  709.                             {'width': 4},
  710.                             {'width': max_ppd_filename_size, 'margin': 2},
  711.                             {'width': 40, 'margin': 2},
  712.                         )
  713.                     )
  714.  
  715.                 log.info(formatter.compose(("Num.", "PPD Filename", "Description")))
  716.                 log.info(formatter.compose(('-'*4, '-'*(max_ppd_filename_size), '-'*40 )))
  717.  
  718.                 mins_list = mins.keys()
  719.  
  720.                 for y in range(x):
  721.                     log.info(formatter.compose((str(y), mins_list[y], mins[mins_list[y]])))
  722.  
  723.                 x += 1
  724.                 none_of_the_above = y+1
  725.                 log.info(formatter.compose((str(none_of_the_above), "(None of the above match)", '')))
  726.  
  727.                 ok, i = tui.enter_range("\nEnter number 0...%d for printer (q=quit) ?" % (x-1), 0, (x-1))
  728.                 if not ok: sys.exit(0)
  729.  
  730.                 if i == none_of_the_above:
  731.                     enter_ppd = True
  732.                 else:
  733.                     print_ppd = mins_list[i]
  734.  
  735.             if enter_ppd:
  736.                 log.error("Unable to find an appropriate PPD file.")
  737.                 enter_ppd = False
  738.  
  739.                 ok, enter_ppd = tui.enter_yes_no("\nWould you like to specify the path to the correct PPD file to use", 'n')
  740.                 if not ok: sys.exit(0)
  741.                 
  742.                 if enter_ppd:
  743.                     ok = False
  744.  
  745.                     while True:
  746.                         user_input = raw_input(log.bold("\nPlease enter the full filesystem path to the PPD file to use (q=quit) :"))
  747.  
  748.                         if user_input.lower().strip() == 'q':
  749.                             log.info("OK, done.")
  750.                             sys.exit(0)
  751.  
  752.                         file_path = user_input
  753.  
  754.                         if os.path.exists(file_path) and os.path.isfile(file_path):
  755.  
  756.                             if file_path.endswith('.gz'):
  757.                                 nickname = gzip.GzipFile(file_path, 'r').read(4096)
  758.                             else:
  759.                                 nickname = file(file_path, 'r').read(4096)
  760.  
  761.                             try:
  762.                                 desc = nickname_pat.search(nickname).group(1)
  763.                             except AttributeError:
  764.                                 desc = ''
  765.  
  766.                             if desc:
  767.                                 log.info("Description for the file: %s" % desc)
  768.                             else:
  769.                                 log.error("No PPD 'NickName' found. This file may not be a valid PPD file.")
  770.  
  771.                             ok, ans = tui.enter_yes_no("\nUse this file")
  772.                             if not ok: sys.exit(0)
  773.                             if ans: print_ppd = file_path
  774.  
  775.                         else:
  776.                             log.error("File not found or not an appropriate (PPD) file.")
  777.  
  778.                         if ok:
  779.                             break
  780.                 else:
  781.                     log.error("PPD file required. Setup cannot continue. Exiting.")
  782.                     sys.exit(1)
  783.                     
  784.             if auto:
  785.                 location, info = '', 'Automatically setup by HPLIP'
  786.             else:
  787.                 while True:
  788.                     location = raw_input(log.bold("Enter a location description for this printer (q=quit) ?"))
  789.  
  790.                     if location.strip().lower() == 'q':
  791.                         log.info("OK, done.")
  792.                         sys.exit(0)
  793.  
  794.                     # TODO: Validate chars
  795.                     break
  796.  
  797.                 while True:
  798.                     info = raw_input(log.bold("Enter additonal information or notes for this printer (q=quit) ?"))
  799.  
  800.                     if info.strip().lower() == 'q':
  801.                         log.info("OK, done.")
  802.                         sys.exit(0)
  803.  
  804.                     # TODO: Validate chars
  805.                     break
  806.  
  807.             log.info(log.bold("\nAdding print queue to CUPS:"))
  808.             log.info("Device URI: %s" % print_uri)
  809.             log.info("Queue name: %s" % printer_name)
  810.             log.info("PPD file: %s" % print_ppd)
  811.             log.info("Location: %s" % location)
  812.             log.info("Information: %s" % info)
  813.  
  814.             log.debug("Restarting CUPS...")
  815.             status, output = utils.run(restart_cups())
  816.             log.debug("Restart CUPS returned: exit=%d output=%s" % (status, output))
  817.  
  818.             if not os.path.exists(print_ppd): # assume foomatic: or some such
  819.                 status, status_str = cups.addPrinter(printer_name.encode('utf8'), print_uri,
  820.                     location, '', print_ppd, info)
  821.             else:
  822.                 status, status_str = cups.addPrinter(printer_name.encode('utf8'), print_uri,
  823.                     location, print_ppd, '', info)
  824.  
  825.             log.debug("addPrinter() returned (%d, %s)" % (status, status_str))
  826.             
  827.             installed_print_devices = device.getSupportedCUPSDevices(['hp']) 
  828.  
  829.             log.debug(installed_print_devices)
  830.  
  831.             if print_uri not in installed_print_devices or \
  832.                 printer_name not in installed_print_devices[print_uri]:
  833.  
  834.                 log.error("Printer queue setup failed. Please restart CUPS and try again.")
  835.                 sys.exit(1)
  836.             else:
  837.                 pass
  838.                 # TODO:
  839.                 #service.sendEvent(hpssd_sock, EVENT_CUPS_QUEUES_CHANGED, device_uri=print_uri)
  840.  
  841.             if username:
  842.                 import pwd
  843.                 user_path = pwd.getpwnam(username)[5]
  844.                 user_config_file = os.path.join(user_path, '.hplip.conf')
  845.  
  846.                 if os.path.exists(user_config_file):
  847.                     cfg = Config(user_config_file)
  848.                     cfg.last_used.device_uri = print_uri
  849.  
  850.  
  851.         # ******************************* FAX QUEUE SETUP
  852.         if setup_fax and not prop.fax_build:
  853.             log.error("Cannot setup fax - HPLIP not built with fax enabled.")
  854.             setup_fax = False
  855.         
  856.         if setup_fax:
  857.             try:
  858.                 from fax import fax
  859.             except ImportError:
  860.                 # This can fail on Python < 2.3 due to the datetime module
  861.                 setup_fax = False
  862.                 log.warning("Fax setup disabled - Python 2.3+ required.")
  863.  
  864.         log.info("")
  865.  
  866.         if setup_fax:
  867.             tui.header("FAX QUEUE SETUP")
  868.             installed_fax_devices = device.getSupportedCUPSDevices(['hpfax'])    
  869.             log.debug(installed_fax_devices)
  870.  
  871.             if not auto and fax_uri in installed_fax_devices:
  872.                 log.warning("One or more fax queues already exist for this device: %s." % ', '.join(installed_fax_devices[fax_uri]))
  873.                 ok, setup_fax = tui.enter_yes_no("\nWould you like to install another fax queue for this device", 'n')
  874.                 if not ok: sys.exit(0)
  875.  
  876.         if setup_fax:
  877.             if auto: # or fax_name is None:
  878.                 fax_name = default_model + '_fax'
  879.  
  880.             fax_default_model = default_model + '_fax'
  881.  
  882.             # Check for duplicate names
  883.             if fax_uri in installed_fax_devices and \
  884.                 fax_default_model in installed_fax_devices[fax_uri]:
  885.                     i = 2
  886.                     while True:
  887.                         t = fax_default_model + "_%d" % i
  888.                         if t not in installed_fax_devices[fax_uri]:
  889.                             fax_default_model += "_%d" % i
  890.                             break
  891.                         i += 1
  892.  
  893.             if not auto:
  894.                 if fax_name is None:
  895.                     while True:
  896.                         fax_name = raw_input(log.bold("\nPlease enter a name for this fax queue (m=use model name:'%s'*, q=quit) ?" % fax_default_model))
  897.  
  898.                         if fax_name.lower().strip() == 'q':
  899.                             log.info("OK, done.")
  900.                             sys.exit(0)
  901.  
  902.                         if not fax_name or fax_name.lower().strip() == 'm':
  903.                             fax_name = fax_default_model
  904.  
  905.                         name_ok = True
  906.  
  907.                         if fax_uri in installed_fax_devices:
  908.                             for d in installed_fax_devices[fax_uri]:
  909.                                 if fax_name in d:
  910.                                     log.error("A fax queue with that name already exists. Please enter a different name.")
  911.                                     name_ok = False
  912.                                     break
  913.  
  914.                         for c in fax_name:
  915.                             if c in (' ', '#', '/', '%'):
  916.                                 log.error("Invalid character '%s' in fax name. Please enter a name that does not contain this character." % c)
  917.                                 name_ok = False
  918.  
  919.                         if name_ok:
  920.                             break
  921.  
  922.             else:
  923.                 fax_name = fax_default_model
  924.  
  925.             log.info("Using queue name: %s" % fax_name)
  926.  
  927.             fax_type = mq.get('fax-type', FAX_TYPE_NONE)
  928.  
  929.             if fax_type == FAX_TYPE_SOAP:
  930.                 fax_ppd_name = 'HP-Fax2-hplip'
  931.             else:
  932.                 fax_ppd_name = 'HP-Fax-hplip'
  933.  
  934.             for f in ppds:
  935.                 if f.find(fax_ppd_name) >= 0:
  936.                     fax_ppd = f
  937.                     log.debug("Found PDD file: %s" % fax_ppd)
  938.                     break
  939.             else:
  940.                 log.error("Unable to find HP fax PPD file! Please check you HPLIP installation and try again.")
  941.                 sys.exit(1)
  942.  
  943.             if auto:
  944.                 location, info = '', 'Automatically setup by HPLIP'
  945.             else:
  946.                 while True:
  947.                     location = raw_input(log.bold("Enter a location description for this printer (q=quit) ?"))
  948.  
  949.                     if location.strip().lower() == 'q':
  950.                         log.info("OK, done.")
  951.                         sys.exit(0)
  952.  
  953.                     # TODO: Validate chars
  954.                     break
  955.  
  956.                 while True:
  957.                     info = raw_input(log.bold("Enter additonal information or notes for this printer (q=quit) ?"))
  958.  
  959.                     if info.strip().lower() == 'q':
  960.                         log.info("OK, done.")
  961.                         sys.exit(0)
  962.  
  963.                     # TODO: Validate chars
  964.                     break
  965.  
  966.             log.info(log.bold("\nAdding fax queue to CUPS:"))
  967.             log.info("Device URI: %s" % fax_uri)
  968.             log.info("Queue name: %s" % fax_name)
  969.             log.info("PPD file: %s" % fax_ppd)
  970.             log.info("Location: %s" % location)
  971.             log.info("Information: %s" % info)
  972.  
  973.             if not os.path.exists(fax_ppd): # assume foomatic: or some such
  974.                 status, status_str = cups.addPrinter(fax_name.encode('utf8'), fax_uri,
  975.                     location, '', fax_ppd, info)
  976.             else:
  977.                 status, status_str = cups.addPrinter(fax_name.encode('utf8'), fax_uri,
  978.                     location, fax_ppd, '', info)
  979.                     
  980.             log.debug("addPrinter() returned (%d, %s)" % (status, status_str))
  981.             
  982.             installed_fax_devices = device.getSupportedCUPSDevices(['hpfax']) 
  983.  
  984.             log.debug(installed_fax_devices) 
  985.  
  986.             if fax_uri not in installed_fax_devices or \
  987.                 fax_name not in installed_fax_devices[fax_uri]:
  988.  
  989.                 log.error("Fax queue setup failed. Please restart CUPS and try again.")
  990.                 sys.exit(1)
  991.             else:
  992.                 pass
  993.                 # TODO:
  994.                 #service.sendEvent(hpssd_sock, EVENT_CUPS_QUEUES_CHANGED, device_uri=fax_uri)
  995.  
  996.  
  997.         # ******************************* FAX HEADER SETUP
  998.             tui.header("FAX HEADER SETUP")
  999.  
  1000.             if auto:
  1001.                 setup_fax = False
  1002.             else:
  1003.                 while True:
  1004.                     user_input = raw_input(log.bold("\nWould you like to perform fax header setup (y=yes*, n=no, q=quit) ?")).strip().lower()
  1005.  
  1006.                     if user_input == 'q':
  1007.                         log.info("OK, done.")
  1008.                         sys.exit(0)
  1009.  
  1010.                     if not user_input:
  1011.                         user_input = 'y'
  1012.  
  1013.                     setup_fax = (user_input == 'y')
  1014.  
  1015.                     if user_input in ('y', 'n', 'q'):
  1016.                         break
  1017.  
  1018.                     log.error("Please enter 'y' or 'n'")
  1019.  
  1020.             if setup_fax:
  1021.                 d = fax.getFaxDevice(fax_uri, disable_dbus=True)
  1022.  
  1023.                 try:
  1024.                     d.open()
  1025.                 except Error:
  1026.                     log.error("Unable to communicate with the device. Please check the device and try again.")
  1027.                 else:
  1028.                     try:
  1029.                         tries = 0
  1030.                         ok = True
  1031.  
  1032.                         while True:
  1033.                             tries += 1
  1034.  
  1035.                             try:
  1036.                                 current_phone_num = str(d.getPhoneNum())
  1037.                                 current_station_name = str(d.getStationName())
  1038.                             except Error:
  1039.                                 log.error("Could not communicate with device. Device may be busy. Please wait for retry...")
  1040.                                 time.sleep(5)
  1041.                                 ok = False
  1042.  
  1043.                                 if tries > 12:
  1044.                                     break
  1045.  
  1046.                             else:
  1047.                                 ok = True
  1048.                                 break
  1049.  
  1050.                         if ok:
  1051.                             while True:
  1052.                                 if current_phone_num:
  1053.                                     phone_num = raw_input(log.bold("\nEnter the fax phone number for this device (c=use current:'%s'*, q=quit) ?" % current_phone_num))
  1054.                                 else:
  1055.                                     phone_num = raw_input(log.bold("\nEnter the fax phone number for this device (q=quit) ?"))
  1056.                                 if phone_num.strip().lower() == 'q':
  1057.                                     log.info("OK, done.")
  1058.                                     sys.exit(0)
  1059.  
  1060.                                 if current_phone_num and (not phone_num or phone_num.strip().lower() == 'c'):
  1061.                                     phone_num = current_phone_num
  1062.  
  1063.                                 if len(phone_num) > 50:
  1064.                                     log.error("Phone number length is too long (>50 characters). Please enter a shorter number.")
  1065.                                     continue
  1066.  
  1067.                                 ok = True
  1068.                                 for x in phone_num:
  1069.                                     if x not in '0123456789-(+) ':
  1070.                                         log.error("Invalid characters in phone number. Please only use 0-9, -, (, +, and )")
  1071.                                         ok = False
  1072.                                         break
  1073.  
  1074.                                 if not ok:
  1075.                                     continue
  1076.  
  1077.                                 break
  1078.  
  1079.                             while True:
  1080.                                 if current_station_name:
  1081.                                     station_name = raw_input(log.bold("\nEnter the name and/or company for this device (c=use current:'%s'*, q=quit) ?" % current_station_name))
  1082.                                 else:
  1083.                                     station_name = raw_input(log.bold("\nEnter the name and/or company for this device (q=quit) ?"))
  1084.                                 if station_name.strip().lower() == 'q':
  1085.                                     log.info("OK, done.")
  1086.                                     sys.exit(0)
  1087.                                     
  1088.                                 if current_station_name and (not station_name or station_name.strip().lower() == 'c'):
  1089.                                     station_name = current_station_name
  1090.  
  1091.  
  1092.                                 if len(station_name) > 50:
  1093.                                     log.error("Name/company length is too long (>50 characters). Please enter a shorter name/company.")
  1094.                                     continue
  1095.                                 break
  1096.  
  1097.                             try:
  1098.                                 d.setStationName(station_name)
  1099.                                 d.setPhoneNum(phone_num)
  1100.                             except Error:
  1101.                                 log.error("Could not communicate with device. Device may be busy.")
  1102.                             else:
  1103.                                 log.info("\nParameters sent to device.")
  1104.  
  1105.                     finally:
  1106.                         d.close()
  1107.  
  1108.         # ******************************* TEST PAGE
  1109.         if setup_print:
  1110.             print_test_page = False
  1111.  
  1112.             tui.header("PRINTER TEST PAGE")
  1113.  
  1114.             if auto:
  1115.                 if testpage_in_auto_mode:
  1116.                     print_test_page = True
  1117.             else:
  1118.                 ok, print_test_page = tui.enter_yes_no("\nWould you like to print a test page")
  1119.                 if not ok: sys.exit(0)
  1120.  
  1121.             if print_test_page:
  1122.                 path = utils.which('hp-testpage')
  1123.  
  1124.                 if printer_name:
  1125.                     param = "-p%s" % printer_name
  1126.                 else:
  1127.                     param = "-d%s" % print_uri
  1128.  
  1129.                 if len(path) > 0:
  1130.                     cmd = 'hp-testpage %s' % param
  1131.                 else:
  1132.                     cmd = 'python ./testpage.py %s' % param
  1133.  
  1134.                 log.debug(cmd)
  1135.  
  1136.                 os.system(cmd)
  1137.  
  1138.     except KeyboardInterrupt:
  1139.         log.error("User exit")
  1140.  
  1141. log.info("")
  1142. log.info("Done.")
  1143.  
  1144.